#include <stdio.h>
#include <errno.h>
#include <string.h>

/*
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
    从文件流中读取 `nmemb` 个数据块，每个数据块的大小为 `size` 字节，并存储到 `ptr` 指向的内存中。
参数:
    @ptr: 指向存储读取数据的内存地址。
    @size: 每个数据块的大小（以字节为单位）。
    @nmemb: 要读取的数据块的数量。
    @stream: 文件指针。
返回值:
    成功 返回实际读取到的数据块数量

size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);
功能:
    将 `ptr` 指向的内存数据写入文件流，总共写入 `nmemb` 个数据块，每个数据块的大小为 `size` 字节。
参数:
    @ptr: 指向要写入的数据的内存地址。
    @size: 每个数据块的大小（以字节为单位）。
    @nmemb: 要写入的数据块的数量。
    @stream: 文件指针。
返回值:
    成功 返回实际写入的数据块数量，
    失败 返回值小于 `nmemb`。
*/

typedef struct str
{
    char name[128];
    int id;
    char ch;
} str;

#define FOPEN_ERR(FP) if (NULL == FP) \
    { \
    perror("fopen error:"); \
    return 0; \
    } \


str s_srr[5] = {
    {"张1", 1 , '\n'},
    {"张2", 2 , '\n'},
    {"张3", 3 , '\n'},
    {"张4", 4 , '\n'},
    {"张5", 5 , '\n'},
};

str s_srr_1[5] = {};


int main(int argc, char const *argv[])
{

    
    memset( s_srr_1 , 0 , sizeof(s_srr_1) ); // 清空结构体
    
    // 打开文件
    FILE *fp = fopen("张三.txt", "w+");
    FOPEN_ERR(fp);


    // 向程序中写入
    fseek( fp , 0 , SEEK_SET );// 从头开始
    fwrite( s_srr , sizeof(str) , sizeof(s_srr) / sizeof(str) , fp);

    fseek( fp , 0 , SEEK_SET );// 从头开始
    fread( s_srr_1 , sizeof(str) , sizeof(s_srr) / sizeof(str) , fp );


    for (size_t i = 0; i < 5; i++)
    {
        printf("%s%d%c" , s_srr_1[i].name , s_srr_1[i].id , s_srr_1[i].ch);
    }
    


    fclose(fp);

    return 0;
}
